\chapter{Implementaciones}
\ifpdf
    \graphicspath{{Chapter3/Chapter3Figs/PNG/}{Chapter3/Chapter3Figs/PDF/}{Chapter3/Chapter3Figs/}}
\else
    \graphicspath{{Chapter3/Chapter3Figs/EPS/}{Chapter3/Chapter3Figs/}}
\fi

En este capítulo se explicará como funcionan cada una de las implementaciones provistas. La relación entre las diferentes clases se encuentra en la figura~(\ref{Uso}).

\InsertFig{\IncludeGraphicsH{Uso}{2.5in}{92 86 545 742}}{Usos de clases}{Uso}

\InsertFig{\IncludeGraphicsH{DejumbleFS}{2.5in}{92 86 545 742}}{Diagrama de clases - DejumbleFS}{DejumbleFS}


\section{Filtros}

Un filtro se encarga de escoger que partes del sistema de archivos original serán pasadas al organizador. La implementación más sencilla sería usar todo el sistema de archivos original. Se puede complicar un poco más pasando solamente un subdirectorio del sistema original o se puede llegar a filtros más complejos como el resultado de una búsqueda o los archivos de música que tengan en sus metadatos ciertas características.

\InsertFig{\IncludeGraphicsH{Filters}{3.2in}{92 86 545 742}}{Diagrama de clases - Filtros}{Filters}

Los filtros se encuentran en el archivo \path{dejumblefs/filter.py}~(\ref{dejumblefs/filter.py}). Existe una clase base llamada \textit{FileListFilter} que tiene un sólo método público: \textit{filelist}. Este método devuelve una lista de archivos y es únicamente llamado desde el cache. La lista que devuelve contiene ítems con la ruta completa dentro del VFS o una ruta relativa que comienza con ``./'' si el archivo se encuentra en el directorio original donde se montó el sistema de archivos proxy. Esto es necesario ya que una vez montado el sistema de archivos proxy cualquier llamada a su propio directorio accedería al sistema de archivos proxy y no al sistema original. Además puede hacer uso de los parámetros \textit{query} y \textit{root}. Estos parámetros se los define al momento de montar y pueden ser usados por cualquier implementación como información adicional para realizar el filtrado.

\subsection{Directorio Completo}

Este filtro se encuentra en el archivo \path{dejumblefs/filters/completedirectory.py}~(\ref{dejumblefs/filters/completedirectory.py}) y la clase se llama \textit{CompleteDirectoryFileListFilter}. Simplemente pasa todos los archivos que se encuentran en el directorio determinado por la opción root. Se debe usar explícitamente con la opción nonempty al momento de montar.

\subsection{Directorio Original}

Este filtro es la implementación por defecto. Se encuentra en el archivo \path{dejumblefs/filters/originaldirectory.py}~(\ref{dejumblefs/filters/originaldirectory.py}) y la clase se llama \textit{OriginalDirectoryFileListFilter}. Es exactamente igual al anterior pero pasa la lista de archivos existentes en el directorio donde se está montando.

\subsection{Shell}

Este filtro permite ejecutar un comando de shell y se pasa el resultado de esta ejecución. Se presupone que el resultado va a dar un archivo por línea. Se encuentra implementado en el archivo \path{dejumblefs/filters/shell.py}~(\ref{dejumblefs/filters/shell.py}) y la clase se llama \textit{ShellFileListFilter}.

\subsection{Xesam}

Este filtro ejecuta un query xesam y devuelve esta lista de archivos. El código de este organizador se encuentra en el archivo \path{dejumblefs/filters/xesam.py}~(\ref{dejumblefs/filters/xesam.py}) y la clase se llama \textit{XesamFileListFilter}.

\subsection{Nulo}

Este es un filtro de prueba. Solo pasa el archivo /dev/null. Se utiliza para hacer pruebas. Se encuentra en el archivo \path{dejumblefs/filters/null.py}~(\ref{dejumblefs/filters/null.py}) y la clase se llama \textit{NullFileListFilter}.


\section{Caches}

El cache se encarga de guardar o escribir los cambios en el sistema de archivos original. El cache más simple escribe directamente los cambios al sistema de archivos original. Un cache diferente podría simplemente escribir cualquier cambio a memoria y descartarlos cuando se desmonten. Además el cache es el encargado de mantener la lista de archivos que se encuentran en el sistema de archivos proxy para que el organizador la lea.

\InsertFig{\IncludeGraphicsH{Caches}{2.7in}{92 86 545 742}}{Diagrama de clases - Caches}{Caches}

El código para este módulo se encuentra en el archivo \path{dejumblefs/cache.py}~(\ref{dejumblefs/cache.py}). Consiste en una clase base llamada \textit{Cache} que provee un conjunto de funciones para almacenar la lista de archivos que se encuentran en el sistema de archivos proxy. Además esta implementación, de la que heredan todos los caches, provee todas las funciones necesarias para acceder al sistema de archivos original y a sus archivos directamente por defecto.

\subsection{PassThrough}

Este tipo de cache simplemente reenvía todos los comandos al sistema de archivos original. Se encuentra implementado en el archivo \path{dejumblefs/caches/passthrough.py}~(\ref{dejumblefs/caches/passthrough.py}) y la clase se llama \textit{PassThroughCache}.

\subsection{Sandbox}

Este tipo de cache lee del disco una vez y guarda cualquier cambio solamente en memoria. Al desmontar el sistema de archivos proxy el sistema de archivos original queda sin cambios. El código para este cache se encuentra en el archivo \path{dejumblefs/caches/sandbox.py}~(\ref{dejumblefs/caches/sandbox.py}) y la clase se llama \textit{SandboxCache}.


\section{Organizadores}

Un organizador se encarga de tomar los archivos que fueron filtrados y los organiza en una estructura de directorios tradicional. El organizador puede ubicar un archivo en varias localizaciones de esta estructura.

El organizador debe poder hacer un mapeo de los archivos en dos direcciones, es decir debe poder conocer el nombre (o nombres) de un archivo en el espacio de nombres transformado dado el nombre del archivo en el espacio de nombres original y además poder hacerlo en la dirección contraria, saber el nombre del archivo en el espacio de nombres original dado el nombre del archivo en el espacio de nombres transformado.

\InsertFig{\IncludeGraphicsH{Organizers}{3.5in}{92 86 545 742}}{Diagrama de clases - Organizadores}{Organizers}

En el archivo \path{dejumblefs/organizer.py}~(\ref{dejumblefs/organizer.py}) se encuentra una clase llamada \textit{Organizer}. Esta clase implementa los métodos básicos para crear un organizador. Por un lado tenemos las funciones que son llamadas directamente desde el modulo de FUSE: \textit{getattr} y \textit{readdir}.

\begin{itemize}
\item[getattr] La implementación básica de \textit{getattr} devuelve los mismos permisos del directorio donde fue montado el sistema de archivos proxy para el caso de directorios que no existen en el sistema original o devuelve los permisos tal y como estaban en el sistema original.
\item[readdir] La función \textit{readdir} devuelve un lista de archivo para un directorio en específico.
\end{itemize}

Además de estas funciones existen varias funciones necesarias para generar un árbol de directorios nuevo basado en el árbol de directorios original y funciones para evitar conflictos en los nombres. Las subclases de \textit{Organizer} deben implementar dos funciones: \textit{paths} y \textit{dirlist}.

\begin{itemize}
\item[paths] Devuelve una lista de rutas de archivos dado una ruta en el sistema de archivos original. Esta función se llama cuando el sistema se inicializa o cuando el cache expira con todos los archivos que tiene el cache.
\item[dirlist] Devuelve una lista de archivos y directorios dado un directorio en el sistema de archivos proxy. Los directorios que devuelva \textit{dirlist} deben ser directorios que no existan en el sistema de archivos original, pero que existan en el sistema de archivos proxy.
\end{itemize}

\subsection{Original}

Presenta los archivos en la misma estructura de directorios del sistema de archivos original. La implementación se encuentra en el archivo \path{dejumblefs/organizers/original.py}~(\ref{dejumblefs/organizers/original.py}) y se llama \textit{OriginalOrganizer}. Lo que hace es atravesar todo el sistema de archivos original desde la raíz definida por el parametro \textit{root} al momento de montar.

\subsection{Plano}

Este organizador presenta todos los archivos encontrados en un sólo directorio. La implementación se encuentra en el archivo \path{dejumblefs/organizers/flat.py}~(\ref{dejumblefs/organizers/flat.py}) y se llama \textit{FlatOrganizer}. Este organizador atraviesa todo el sistema de archivos original desde la raíz definida por el parámetro \textit{root} al momento de montar y extrae solamente el nombre de los archivos encontrados descartando la parte del directorio donde se encontraban.

\subsection{TagOrganizer}

Este organizador no se puede usar directamente, se deben usar alguna de sus subclases. La implementación se encuentra en el archivo \path{dejumblefs/organizer.py}~(\ref{dejumblefs/organizer.py}) y se llama \textit{TagOrganizer}. Provee la funcionalidad de poder asignar etiquetas a los archivos y luego presentar una lista de etiquetas como los directorios en la raíz del sistema de archivos montado y dentro de cada uno de estos directorios los archivos que contienen estos tags.

\subsection{Fecha}

Este organizador extiende del organizador \textit{TagOrganizer}. Asigna tags a los archivos dada su fecha de actualización. La implementación se encuentra en el archivo \path{dejumblefs/organizers/date.py}~(\ref{dejumblefs/organizers/date.py}) y se llama \textit{DateOrganizer}. Esta clase asigna los siguientes tags:

\begin{itemize}
\item[Today] Se lo asigna a todos los archivos modificados el día de hoy.
\item[This Week] Se lo asigna a todos los archivos modificados esta semana.
\item[Last Week] Se lo asigna a todos los archivos modificados la semana pasada.
\item[YYYY MM] Se lo asigna a todos los archivos dado su mes de modificación, por ejemplo ``2008 March''
\end{itemize}

\subsection{Documentos}

Este organizador extiende del organizador \textit{TagOrganizer}. Asigna tags a los archivos dada su extensión. La implementación se encuentra en el archivo \path{dejumblefs/organizers/documents.py}~(\ref{dejumblefs/organizers/documents.py}) y se llama \textit{DocumentsOrganizer}. Lee un mapeo de extensiones a una descripción de tipo de archivo de un archivo de configuración. Asigna tags a los archivos dependiendo este mapeo.

\subsection{ISO 9660}

Presenta los archivos de acuerdo al estándar ISO 9660 que es muy similar al estilo que usaba DOS de 8 caracteres el nombre y 3 la extensión. La implementación se encuentra en el archivo \path{dejumblefs/organizers/iso9660.py}~(\ref{dejumblefs/organizers/iso9660.py}) y se llama \textit{ISO9660Organizer}.

% ------------------------------------------------------------------------

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "../thesis"
%%% End: 
